<?php
/**
 * Created by PhpStorm.
 * User: yf
 * Date: 2018/3/10
 * Time: 下午5:56
 */
namespace App\Utility;

use EasySwoole\Trigger\Trigger;
use EasySwoole\EasySwoole\Config;
use App\Utility\Pool\MySQLPool;
use App\Utility\Pool\MySQLObject;
use EasySwoole\Component\Pool\PoolManager;
use EasySwoole\Mysqli\Mysqli;

/**
 * 连接MySql连接池对象
 * @author Admin
 */
class DBTools 
{

    /**
     * TODO 获取DB连接池操作对象
     * 注意：需要手动释放 :destPoolDb()
     * @return object MySQL连接对象
     */
    public static function getPoolDB($timeOut = 0.1): ? Mysqli
    {
        $db = PoolManager::getInstance()->getPool(MySQLPool::class)->getObj();
        BaseEnum::Logger("DBTools __getPoolDb Is 获取DB池!","user-login");
        return $db;
    }
    
    /**
     * TODO 销毁DB池
     * @param boolean $dbobj MySQLObject对象
     */
    public static function destPoolDB($dbobj = FALSE){
        if(!is_null($dbobj) && $dbobj instanceof MySQLObject){
            BaseEnum::Logger("DBTools __destruct  释放DB池","user-login");
            PoolManager::getInstance()->getPool(MySQLPool::class)->recycleObj($dbobj);
        }
    }
    
    
    /**
     * TODO 创建MySQL操作
     * TODO 执行SQL查询操作
     */
    public static function querySQL($querysql,$bindParams){
        if (defined('DEBUG_MODEL_FLAG')) {
            return DBTools::loadTempDbConected(FALSE) -> rawQuery($querysql,$bindParams);//TODO 临时DB类
        }
        return MySQLPool::invoke(function (MySQLObject $db) use($querysql,$bindParams){
            return $db->rawQuery($querysql,$bindParams);
        });
    }
    
    
    //TODO 组装查询条件 
    private static function createWhereOption(&$db,$options = FALSE){
        if (!empty($options) && ($db instanceof MySQLObject || $db instanceof \MysqliDb)) {
            foreach ($options as $field => $fval){
                //TODO 查询条件值处理： 'name'=> ['text' => $userName,"mark"=> '='],
                $secValue = $fval['text'] ?? FALSE;
                if(!empty($fval) && is_array($fval) && $secValue !==FALSE){  //要处理值为Object类型
                    $oneFh = isset($fval['mark']) ? $fval['mark'] : "=";    //取符号
                    if (!empty($oneFh) && strtoupper($oneFh) == 'IN' && !empty($secValue) && is_array($secValue)) {
                        $db -> whereIn($field, $secValue);
                    }else{
                        $db -> where($field,$secValue,$oneFh);
                    }
                }else if(isset($fval) && $fval !== ""){
                    $db -> where($field,$fval,"=");
                }
            }
        }
    }
    
    /**
     * TODO 查询SQL
     * @param $wheres 查询条件支持两种：
     * 第一种： KEY=>Value 型  ； 即 ： name=>test,password=>abc123
     * 第二种： KEY=>Array()型； 即 ：'name'=> ['text' => $userName,"mark"=> '='], 
     * @return mixed
     */
    public static function PoolGet($tbName,$row = null,$fields = '*',$wheres = FALSE){
        if (defined('DEBUG_MODEL_FLAG')) {
            return DBTools::loadTempDbConected( $wheres ) -> get($tbName,$row,$fields);//TODO 临时DB类
        }
        return MySQLPool::invoke(function (MySQLObject $db) use($tbName,$row,$fields,$wheres){
            self::createWhereOption($db,$wheres);   //TODO 查询条件 
            return $db->get($tbName,$row,$fields);
        });
    }
    
    /**
     * TODO 查询一条数据
     * @param $wheres 查询条件支持两种：
     * 第一种： KEY=>Value 型  ； 即 ： name=>test,password=>abc123
     * 第二种： KEY=>Array()型； 即 ：'name'=> ['text' => $userName,"mark"=> '='],
     * @return mixed
     */
    public static function PoolGetOne($tbName,$fields = '*',$wheres = FALSE){
        if (defined('DEBUG_MODEL_FLAG')) {
            return DBTools::loadTempDbConected( $wheres ) -> getOne($tbName,$fields);//TODO 临时DB类
        }
        return MySQLPool::invoke(function (MySQLObject $db) use($tbName,$fields,$wheres){
            self::createWhereOption($db,$wheres);   //TODO 查询条件 
            return $db->getOne($tbName,$fields);
        });
    }
    
    /**
     * TODO 更新数据
     * @param $wheres 查询条件支持两种：
     * 第一种： KEY=>Value 型  ； 即 ： name=>test,password=>abc123
     * 第二种： KEY=>Array()型； 即 ：'name'=> ['text' => $userName,"mark"=> '='],
     * @return mixed
     */
    public static function PoolUpdate($tbName,$editdata = FALSE,$wheres = FALSE){
        if (defined('DEBUG_MODEL_FLAG')) {
            return DBTools::loadTempDbConected($wheres) -> update($tbName,$editdata,null);//TODO 临时DB类
        }
        return MySQLPool::invoke(function (MySQLObject $db) use($tbName,$editdata,$wheres){
            self::createWhereOption($db,$wheres);   //TODO 查询条件
            return $db->update($tbName,$editdata,null);
        });
    }
    
    
    /**
     * TODO 添加一行数据
     * @param object $linedata 一个Object对象
     * @return mixed
     */
    public static function PoolInsert($tbName,$linedata = FALSE,$lastId = FALSE){
        if (defined('DEBUG_MODEL_FLAG')) {
            $db = DBTools::loadTempDbConected(FALSE) ;    //TODO 临时DB类
            $res = $db -> insert($tbName, $linedata);
            return $lastId ? $db->getInsertId() : $res ;
        }
        return MySQLPool::invoke(function (MySQLObject $db) use($tbName,$linedata,$lastId){
            $insertRes = $db->insert($tbName,$linedata);
            if ($lastId === TRUE) { //获取最后一行的ID值；
                $insertRes =  $db->getInsertId();
            }
            return $insertRes;
        });
    }
    /**
     * TODO 添加一行数据
     * @param array $multiData 多个Object对象组成的数组
     * @return mixed
     */
    public static function PoolInsertMultis($tbName,$multiData = FALSE){
        if(!$multiData || !is_array($multiData)) return false;
        return MySQLPool::invoke(function (MySQLObject $db) use($tbName,$multiData){
            //插入多行数据
            return $db->insertMulti($tbName,$multiData);
        });
    }
    
    /**
     * TODO 添加一行数据
     * @param object $linedata 一个Object对象
     * @return mixed
     */
    public static function PoolDelete($tbName,$wheres = FALSE){
        return MySQLPool::invoke(function (MySQLObject $db) use($tbName,$wheres){
            self::createWhereOption($db,$wheres);
            return $db->delete($tbName,null);;
        });
    }

    
    //TODO 临时DB类
    public static function loadTempDbConected( $wheres = FALSE) {
        $dbobj = new \MysqliDb("192.168.0.147","root","svn678mysql","ChessCards");
        if(!empty($wheres)) self::createWhereOption($dbobj,$wheres);
        return $dbobj;
    }
}
